package com.company.db;

import org.apache.commons.dbcp2.BasicDataSource;

import javax.sql.DataSource;

/**
 *单例模式提供DBCP数据源
 * 单例模式：一个类只有唯一的一个实例对象，也就是从任何一个途径获取到的这个类的实例对象是唯一的
 */

public class DBCPDataSource {

    //1.定义一个单例模式类的静态实例变量（那个类要实现单例模式就定义这个类的遍变量）
    private static DataSource dataSource;

    //2.将该类的构造方法私有化；【不容许外部进行new操作】
    private DBCPDataSource(){

    }
    //3.提供一个静态的获取该类的实例对象的方法入口

    //这里的线程是不安全；需要添加synchronized 保证单例模式的线程安全
    public  static  synchronized DataSource getDataSource(){
        //静态的单例变量的初始化
        if (dataSource == null){

            //(0)准备数据库连接的相关参数
            //数据库的驱动类的名字，包，路径名
            String strDriverName4Mysql8 = "com.mysql.cj.jdbc.Driver";
            String strDriverName4Mysql5 = "com.mysql.jdbc.Driver";
            String strDriverName4Oracle = "oracle.jdbc.driver.OracleDriver";

            //数据库服务器的连接串
            //连接串的localhost 127.0.0.1 ip地址，服务器名，表示服务器的访问路径 3306 mysql数据库服务器监听的端口号
            String strURL4Mysql8 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
            String strURL4Mysql5 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8";
            String strURL4Oracle = "jdbc:oracle:thin:@localhost:1521:orcl";

            //登录数据库的用户名和密码
            String strUserName = "root";
            String strUserPsw = "111111";

            /**
             * 先写第一次的实例对象，在写数据库的连接属性，连接的各项参数属性
             * 在写数据库的连接串
             */
            //第一次获取实例对象是，需要初始化操作
            BasicDataSource basicDataSource = new BasicDataSource();

            //设置数据库的连接属性
            basicDataSource.setUrl(strURL4Mysql5);//数据库路径
            basicDataSource.setDriverClassName(strDriverName4Mysql5);
            basicDataSource.setUsername(strUserName);
            basicDataSource.setPassword(strUserPsw);
            //设置数据源的各项参数属性
            basicDataSource.setInitialSize(2);//数据库连接池一开始初始化的连接数为2
            //数据源性能参数先使用默认的，后面进行补充

            //创建的dbcp2的数据源复制给单例模式实例对象
            dataSource = basicDataSource;
        }
        return dataSource;
    }
}
